/*
 * @(#)Action.java $version 2010. 8. 11
 *
 * Copyright 2007-2010 NHN Corp. All rights Reserved. 
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.nhncorp.usf.core.config.runtime;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Action에대한 수행 성공과 실패에 대한 {@link ResultPageInfos}와 {@link BusinessObject} 리스트 정의.
 *
 * @author Web Platform Development Team.
 */
public class Action {
    /**
     * 액션 식별자.
     */
    private String id;

    /**
     * 액션 Type
     * (common : Page가 호출되어서 특정 action이 수행되기 전에 항상 수행되는 action)
     * (normal : 일반적인 action )
     */
    private String type = "normal";

    /**
     * 액션 단위의 퍼미션.
     */
    private PermissionInfo permissionInfo;

    /**
     * 액션 수행 전/후에 필요한 Interceptor 또는 interceptor 스택.
     */
    private String interceptor;

    /**
     * 액션 수행 전/후에 필요한 Interceptor 또는 interceptor 스택.
     * 여러개의 interceptor-ref를 지정하거나 인터셉터에 파라미터를 지정할수 있는 점이 interceptor 필드와 다름
     */
    List<RuntimeInterceptorConfig> interceptors = new ArrayList<RuntimeInterceptorConfig>();

    /**
     * 액션 성공에 대한 처리를 위한 {@link ResultPageInfos}
     */
    private ResultPageInfos successResultInfo;

    /**
     * 액션 실패에 대한 처리를 위한 {@link ResultPageInfos}
     */
    private ResultPageInfos failureResultInfo;

    /**
     * 순차적으로 service 로서 수행되어야 하는 {@link BusinessObject} 리스트 관리
     */
    private List<Service> businessObjectInfos = new ArrayList<Service>();

    /** 병렬로 실행되는 Service 목록 (Services 하부의 Service 들) */
    private List<Service> controlBlockInfos = new ArrayList<Service>();

    private List<Service> boGroupInfos = new ArrayList<Service>();

    private ScriptInfo resultCommonScriptInfo;

    /**
     * 생성자.
     */
    public Action(String id) {
        this.id = id;
    }

    /**
     * 생성자.
     */
    public Action(String id, String type) {
        this.id = id;
        this.type = type;
    }

    /**
     * 액션 식별자 반환.
     *
     * @return the action id
     */
    public String getId() {
        return this.id;
    }

    /**
     * 액션 단위의 퍼미션 반환.
     *
     * @return the PermissionInfo
     */
    public PermissionInfo getPermission() {
        return this.permissionInfo;
    }

    /**
     * 액션 단위의 퍼미션 설정.
     *
     * @param permissionInfo the permission information for action
     */
    public void setPermissionInfo(PermissionInfo permissionInfo) {
        this.permissionInfo = permissionInfo;
    }

    /**
     * 액션 수행 전/후에 필요한 Interceptor 스택 반환.
     *
     * @return the interceptor name for action
     */
    public String getInterceptor() {
        return this.interceptor;
    }

    /**
     * 액션 수행 전/후에 필요한 Interceptor 스택 설정.
     *
     * @param interceptorStack the interceptor stack name
     */
    public void setInterceptor(String interceptorStack) {
        this.interceptor = interceptorStack;
    }

    /**
     * Adds the runtime interceptor.
     *
     * @param interceptor the interceptor
     */
    public void addRuntimeInterceptor(RuntimeInterceptorConfig interceptor) {
        interceptors.add(interceptor);
    }

    /**
     * Gets the runtime interceptors.
     *
     * @return the runtime interceptors
     */
    public List<RuntimeInterceptorConfig> getRuntimeInterceptors() {
        if (interceptors == null) {
            return Collections.emptyList();
        }

        return interceptors;
    }

    /**
     * 액션 수행 성공에 대한 후처리 {@link ResultPageInfos} 반환.
     *
     * @return ResultPageInfos the success page information
     */
    public ResultPageInfos getSuccessResultInfo() {
        return this.successResultInfo;
    }

    /**
     * 액션 수행 성공에 대한 후처리 {@link ResultPageInfos} 설정.
     *
     * @param successResultInfo the success page information
     */
    public void setSuccessResultInfo(ResultPageInfos successResultInfo) {
        this.successResultInfo = successResultInfo;
    }

    /**
     * 액션 수행 실패에 대한 후처리 {@link ResultPageInfos} 반환.
     *
     * @return ResultPageInfos the failure page information
     */
    public ResultPageInfos getFailureResultInfo() {
        return this.failureResultInfo;
    }

    /**
     * 액션 수행 실페에 대한 후처리 {@link ResultPageInfos} 설정.
     *
     * @param failureResultInfo the failure page information
     */
    public void setFailureResultInfo(ResultPageInfos failureResultInfo) {
        this.failureResultInfo = failureResultInfo;
    }

	/**
	 * 액션 수행을 위해 필요한 {@link BusinessObject} 리스트 반환.
	 *
	 * @return List the service information
	 */
	public List<Service> getBusinessObjectInfos() {
		return businessObjectInfos;
	}

    /**
     * {@link BusinessObject} 추가.
     *
     * @param businessObjectInfo {@link BusinessObject}
     */
    public void addBusinessObjectInfo(Service businessObjectInfo) {
    	businessObjectInfos.add(businessObjectInfo);
    }

    /**
     * Gets the type.
     *
     * @return the type
     */
    public String getType() {
        return type;
    }

    /**
     * Gets the result common script info.
     *
     * @return the result common script info
     */
    public ScriptInfo getResultCommonScriptInfo() {
        return resultCommonScriptInfo;
    }

    /**
     * Sets the result common script info.
     *
     * @param resultCommonScriptInfo the new result common script info
     */
    public void setResultCommonScriptInfo(ScriptInfo resultCommonScriptInfo) {
        this.resultCommonScriptInfo = resultCommonScriptInfo;
    }

    /**
     * Gets the control block infos.
     *
     * @return the control block infos
     */
    public List<Service> getControlBlockInfos() {
        return controlBlockInfos;
    }

    /**
     * Adds the control block infos.
     *
     * @param controlBlockInfo the control block info
     */
    public void addControlBlockInfos(Service controlBlockInfo) {
        this.controlBlockInfos.add(controlBlockInfo);
    }

    /**
     * Adds the control block infos by list
     *
     * @param controlBlockInfos the control block info list
     */
    public void addControlBlockInfoAll(List<Service> controlBlockInfos) {
		this.controlBlockInfos.addAll(controlBlockInfos);
	}
    
    /**
     * Gets the bo group infos.
     * bogroup 은 Service 로 통합됨. {@code getControlBlockInfos}, {@code getBusinessObjectInfos 사용}
     * 
     * @return the bo group infos
     */
    @Deprecated
    public List<Service> getBoGroupInfos() {
        return boGroupInfos;
    }

    /**
     * Adds the bo group infos.
     * bogroup 은 Service 로 통합됨. {@code addControlBlockInfos}, {@code addBusinessObjectInfo} 사용
     * 
     * @param boGroupInfo the bo group info
     */
    @Deprecated
    public void addBoGroupInfos(Service boGroupInfo) {
        this.boGroupInfos.add(boGroupInfo);
    }

}
